package com.summer.filesync.security;

/** 用户角色枚举 定义系统中的用户角色和权限级别 */
public enum UserRole {
  /** 管理员 - 完全访问权限 */
  ADMIN("admin", 100, "系统管理员，拥有所有权限"),

  /** 操作员 - 读写权限 */
  OPERATOR("operator", 50, "操作员，可以查看和修改配置"),

  /** 观察者 - 只读权限 */
  VIEWER("viewer", 10, "观察者，只能查看状态信息"),

  /** 匿名用户 - 无权限 */
  ANONYMOUS("anonymous", 0, "匿名用户，无访问权限");

  private final String code;
  private final int level;
  private final String description;

  UserRole(String code, int level, String description) {
    this.code = code;
    this.level = level;
    this.description = description;
  }

  public String getCode() {
    return code;
  }

  public int getLevel() {
    return level;
  }

  public String getDescription() {
    return description;
  }

  /**
   * 检查当前角色是否有权限执行指定级别的操作
   *
   * @param requiredLevel 所需权限级别
   * @return 是否有权限
   */
  public boolean hasPermission(int requiredLevel) {
    return this.level >= requiredLevel;
  }

  /**
   * 检查当前角色是否有权限执行指定角色的操作
   *
   * @param requiredRole 所需角色
   * @return 是否有权限
   */
  public boolean hasPermission(UserRole requiredRole) {
    return this.level >= requiredRole.level;
  }

  /**
   * 根据代码获取角色
   *
   * @param code 角色代码
   * @return 角色，如果不存在返回ANONYMOUS
   */
  public static UserRole fromCode(String code) {
    if (code == null) {
      return ANONYMOUS;
    }

    for (UserRole role : values()) {
      if (role.code.equalsIgnoreCase(code)) {
        return role;
      }
    }

    return ANONYMOUS;
  }

  /** 权限级别常量 */
  public static class Permissions {
    public static final int VIEW_STATUS = 10; // 查看状态
    public static final int VIEW_CONFIG = 20; // 查看配置
    public static final int MODIFY_CONFIG = 50; // 修改配置
    public static final int SYSTEM_ADMIN = 100; // 系统管理
  }
}
